Go の functional option pattern
default 値を設定できる
省略 (default 値が設定されるべき) と 0 値 (0 値が設定されるべき) とを混同しない
code:go
type FOpt struct {
Opt1 int
Opt2 string
}
func FOpt1(i int) func(*FOpt) {
return func(o *FOpt) { o.Opt1 = i }
}
func FOpt2(s string) func(*FOpt) {
return func(o *FOpt) { o.Opt2 = s }
}
func F(arg1 Arg1, options ...func(*FOpt)) {
option := FOpt{}
for _, f := range options {
f(&option)
}
// do something using option
}
func main() {
// 省略できる
F(arg1)
// 設定できる。設定する順番も自由
F(arg1, func(o *FOpt) { o.Opt1 = 42; o.Opt2 = "spam" })
// wrapper 函數
F(arg1, FOpt1(42))
F(arg1, FOpt1(42), FOpt2("spam"))
}